package com.lagou.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/*
* 通知类  around建议单独使用  注解的方式顺序为 前置-执行-最终-后置（异常）  后置/异常(只有一个)
* 所以解决的方法建议使用xml 或者用注解里的around来控制执行顺序
* */
@Component
@Aspect //升级为切面类 配置切入点和通知的关系
public class MyAdvice {

    //设置切入点
    @Pointcut("execution(* com.lagou.service.impl.AccountServiceImpl.transfer())")
    public void myPoint(){}

    @Before("MyAdvice.myPoint()")
    public void before(){
        System.out.println("前置方法执行了...");
    }

    @AfterReturning("MyAdvice.myPoint()")
    public void afterReturning(){
        System.out.println("后置通知执行了...");
    }

    @AfterThrowing("MyAdvice.myPoint())")
    public void afterThrowing(){
        System.out.println("异常通知执行了...");
    }

    @After("MyAdvice.myPoint()")
    public void after(){
        System.out.println("最终通知执行了...");
    }

/*    @Around("MyAdvice.myPoint()")
    public Object around(ProceedingJoinPoint pjp){

        try {
            System.out.println("前置通知执行了...");
            Object proceed = pjp.proceed();
            System.out.println("后置通知执行了...");
        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("异常通知执行了...");
        }finally {
            System.out.println("最终通知执行了...");
        }
        return null;
    }*/
}
